package com.hejia.alauda.service;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import com.hejia.alauda.entity.BankCard;
import com.hejia.alauda.entity.DayInventory;
import com.hejia.alauda.entity.Financing;
import com.hejia.alauda.entity.Order;
import com.hejia.alauda.entity.PayGate;
import com.hejia.alauda.entity.Product;
import com.hejia.alauda.utils.Pager;

/**
 * 
 * 统计服务
 *
 *
 * Created by showone on 2014 上午10:34:07.
 */
public interface StatisticService {
	/**
	 * 日总订单销售量
	 * 
	 * @param statDate
	 *            统计日期(yyyy-mm-dd)
	 * @return
	 */
	public Double dayTotalSales(String statDate);

	/**
	 * 日各订单销售量
	 * 
	 * @param statDate
	 *            统计日期(yyyy-mm-dd)
	 * @return Map<产品id,日销售量>
	 */
	public Map<Integer, Double> daySales(String statDate);

	/**
	 * 
	 * 不同状态下的日总订单总销售量
	 * 
	 * @param statDate
	 *            统计日期(yyyy-mm-dd)
	 * @param status
	 *            订单状态
	 * @return
	 */

	public Double dayTotalSales(String statDate, Order.Status status);

	/**
	 * 日各订单销售量
	 * 
	 * @param statDate
	 *            统计日期(yyyy-mm-dd)
	 * @param status
	 *            订单状态
	 * @return Map<产品id,日销售量>
	 */
	public Map<Integer, Double> daySales(String statDate, Order.Status status);

	/**
	 * 购买人数
	 * 
	 * @param statDate
	 *            统计日期(yyyy-mm-dd)
	 * @return
	 */
	public int numberOfBuyer(String statDate);

	/**
	 * 不同状态下的购买人数
	 * 
	 * @param statDate
	 *            统计日期(yyyy-mm-dd)
	 * @return
	 */
	public int numberOfBuyer(String statDate, Order.Status status);

	/**
	 * 日总订单数量
	 * 
	 * @param statDate
	 *            统计日期(yyyy-mm-dd)
	 * @return
	 */
	public int dayNumOfOrder(String statDate);

	/**
	 * 不同状态下日订单数量
	 * 
	 * @param statDate
	 *            统计日期(yyyy-mm-dd)
	 * @return
	 */
	public int dayNumOfOrder(String statDate, Order.Status status);

	/**
	 * 
	 * 多日不同状态下的订单总销售量
	 * 
	 * @param statDate
	 *            统计日期(yyyy-mm-dd)
	 * @param status
	 *            订单状态
	 * @return
	 */

	public Double manyDaysTotalSales(String statDate, String statDate2,
			Order.Status status);

	/**
	 * 多日不同状态下的购买人数
	 * 
	 * @param statDate
	 *            统计日期(yyyy-mm-dd)
	 * @return
	 */
	public int manyDaysNumOfBuyer(String statDate, String statDate2,
			Order.Status status);

	/**
	 * 多日不同状态下的订单数
	 * 
	 * @param statDate
	 *            统计日期(yyyy-mm-dd)
	 * @return
	 */
	public int manyDaysNumOfOrder(String statDate, String statDate2,
			Order.Status status);

	/**
	 * 
	 * 所有不同状态下的订单总销售量
	 * 
	 * @param statDate
	 *            统计日期(yyyy-mm-dd)
	 * @param status
	 *            订单状态
	 * @return
	 */

	public Double allDaysTotalSales(Order.Status status);

	/**
	 * 所有不同状态下的购买人数
	 * 
	 * @param statDate
	 *            统计日期(yyyy-mm-dd)
	 * @return
	 */
	public int allDaysNumOfBuyer(Order.Status status);

	/**
	 * 多日不同状态下的订单数
	 * 
	 * @param statDate
	 *            统计日期(yyyy-mm-dd)
	 * @return
	 */
	public int allDaysNumOfOrder(Order.Status status);

	/**
	 * 单个产品统计不同状态下的销售量
	 * 
	 * @param id
	 *            ,status 统计日期(yyyy-mm-dd)
	 * @return
	 */
	public Double productTotalSales(Long id, Order.Status status);

	/**
	 * 单个产品统计不同状态下人数
	 * 
	 * @param id
	 *            ,status 统计日期(yyyy-mm-dd)
	 * @return
	 */
	public int productNumOfBuyer(Long id, Order.Status status);

	/**
	 * 单个产品统计不同状态下订单数
	 * 
	 * @param id
	 *            ,status 统计日期(yyyy-mm-dd)
	 * @return
	 */
	public int productNumOfOrder(Long id, Order.Status status);

	/**
	 * 单日注册用户
	 * 
	 * @param regdate
	 * @return
	 */
	public Integer dayNumOfUser(String regdate);

	/**
	 * 查多日注册用户
	 * 
	 * @param regdate
	 *            ,manydate
	 * @return
	 */
	public Integer dayNumOfUser(String regdate, String manydate);

	/**
	 * 用户注册数
	 * 
	 * @return
	 */
	public Integer numberOfUser();

	/**
	 * 查询各种用户人数
	 * 
	 * @param startdate
	 * @param enddate
	 * @param param
	 * @return
	 */
	public int numOfPersons(String startdate, String enddate, String param);

	/**
	 * 
	 * @param productPaid
	 * @param productPaidOrder
	 * @return
	 */
	Double selectPerAmount(BigDecimal productPaid, Integer productPaidOrder);

	/**
	 * 查询总收入
	 * 
	 * @return
	 */
	public Double allIncomeAndExpense(String param);

	/**
	 * 根据日期查询收入和支出
	 * 
	 * @param startdate
	 * @param enddate
	 * @param param
	 * @return
	 */
	public Double incomeAndExpense(String startdate, String enddate,
			String param);

	/**
	 * 
	 * @param startDate
	 * @param endDate
	 * @param index
	 * @return
	 */
	public List<Map<String, Object>> statOperationIndex(String startDate,
			String endDate, String index);

	/**
	 * 
	 * @param statDate
	 *            统计日期
	 * @param productId
	 *            产品Id
	 * @param param
	 *            统计项
	 * @return
	 */
	public List<Map<String, Object>> productAnalyse(String startDate,
			String endDate, String index);

	/**
	 * 查询日期内的所有产品
	 * 
	 * @param statDate
	 * @param statDate2
	 * @return
	 */
	public List<Product> allProductByDate(String statDate, String statDate2);

	/**
	 * 根据地区分析
	 * 
	 * @return
	 */
	public List<Map<String, Object>> statInventoryByRegion();

	/**
	 * 根据地区分析（浙江省内）
	 * 
	 * @return
	 */
	public List<Map<String, Object>> statInventoryInZheJiang();

	/**
	 * 根据类别分析保有量
	 * 
	 * @return
	 */
	public List<Map<String, Object>> statInventoryByType();

	/**
	 * 根据地区查保有量，前十条
	 * 
	 * @return
	 */
	public List<Map<String, Object>> statByRegionLimit();

	/**
	 * 根据浙江省内查保有量，前十条
	 * 
	 * @return
	 */
	public List<Map<String, Object>> statInZheJiangLimit();

	/**
	 * 查询保有量周期组成
	 * 
	 * @param startdate
	 * @param enddate
	 * @param param
	 * @return
	 */
	public List<Map<String, Object>> statInventory(String startdate,
			String enddate, String param);

	/**
	 * 查询保有量收益率组成
	 * 
	 * @param startdate
	 * @param enddate
	 * @param param
	 * @return
	 */
	public List<Map<String, Object>> statByIntere(String startdate,
			String enddate, String param);

	/**
	 * 保有量（定时插入用）
	 * 
	 * @return
	 */
	public Map<String, Object> stattrendByMonth(String enddateString);

	/**
	 * 保有量趋势使用
	 * 
	 * @return
	 */
	public Double stattrendByDate(String enddateString);

	/**
	 * 销售量现状
	 * 
	 * @return
	 */
	public List<Map<String, Object>> salesStatus(String param);

	/**
	 * 销售量组成
	 * 
	 * @return
	 */
	public List<Map<String, Object>> salesConsist(String startdate,
			String enddate, String param);

	/**
	 * 按天查询保有量趋势
	 * 
	 * @param startdate
	 * @param enddate
	 * @return
	 */
	public List<Map<String, Object>> inventoryByDay(String startdate,
			String enddate);

	/**
	 * 按天查询销售量趋势
	 * 
	 * @param startdate
	 * @param enddate
	 * @return
	 */
	public List<Map<String, Object>> selectSalesByDate(String startdate,
			String enddate);

	/**
	 * 查询出需要插入dayinventory表的数据
	 * 
	 * @param statdate
	 * @return
	 */
	public Double selectIntoDayinventory(String statdate, String param);

	/**
	 * 跟据年、月、周查询一段时间的销售量
	 * 
	 * @param statdate
	 * @return
	 */
	public Double selectSalesByTime(String statdate, String param);

	/**
	 * 赎回人数
	 * 
	 * @param startdate
	 * @param enddate
	 * @return
	 */
	public Integer paymentPersons(String startdate, String enddate);

	/**
	 * 查询支付网关下的银行的分别交易金额
	 * 
	 * @param startdate
	 * @param enddate
	 * @return
	 */
	public List<Map<String, Object>> paygatebankStat(String startdate,
			String enddate, String param);

	/**
	 * 保存当天保有量
	 *
	 * @param dayInventory
	 * @return
	 */
	public boolean saveDayInventory(DayInventory dayInventory);

	/**
	 * 查询是否已存在
	 *
	 * @param nowdate
	 * @return
	 */
	public Integer selectInventory(String nowdate);

	/**
	 * 删除已存在的
	 *
	 * @param nowdate
	 */
	public void deleteInventory(String nowdate);

	/**
	 * 昨日票据兑付单
	 */
	Pager<Financing> notesDealOnLastDay(Pager<Financing> pager,
			String createDate);

	/**
	 * 昨日对账清单，按产品分类（总账）
	 *
	 */
	List<Financing> yesCheckList(Pager<Financing> pager, String createDate,
			String paymentChannel);

	/**
	 * 月享 将会废弃，计算方式和 customDealList 相同， 因为查询条件不够自由
	 */
	@Deprecated
	Pager<Financing> monthDealList(Pager<Financing> pager, String createDate);

	/**
	 * 季享 将会废弃，计算方式和 customDealList 相同， 因为查询条件不够自由
	 */
	@Deprecated
	Pager<Financing> seasonDealList(Pager<Financing> pager, String createDate);

	/**
	 * 根据结息日匹配对应的 financing mysql查询时使用 regexp 关键字匹配
	 */
	List<Financing> regexpDealListBySettlementDate(Pager<Financing> pager,
			String name, String... settlementDate);

	/**
	 * 自定义账单查询
	 */
	Pager<Financing> customDealList(Pager<Financing> pager, String createDate,
			String name);

	/**
	 * 卖出产品的名称
	 */
	List<Financing> productName(String createDate, String[] name);

	/**
	 * 取所有到期的产品资产的混总
	 */
	List<Financing> allProduct(Pager<Financing> pager, String settlementDate);

	/**
	 * 支付网关统计——最大交易金额
	 * 
	 * @return
	 */
	public List<Map<String, Object>> paygateHighAmount(String startdate,
			String enddate, String param);

	/**
	 * 支付网关统计——交易笔数
	 * 
	 * @return
	 */
	public List<Map<String, Object>> paygateOrder(String startdate,
			String enddate, String param);

	/**
	 * 支付网关统计——交易成功笔数
	 * 
	 * @return
	 */
	public List<Map<String, Object>> paygateSuccessOrder(String startdate,
			String enddate, String param);

	/**
	 * 查询日期内的支付网关
	 * 
	 * @param statDate
	 * @param statDate2
	 * @return
	 */
	public List<PayGate> payGateByDate(String statDate, String statDate2,
			String param);

	/**
	 * 查询日期内的银行卡
	 * 
	 * @param statDate
	 * @param statDate2
	 * @return
	 */
	public List<BankCard> bankCardByDate(String statDate, String statDate2,
			String param);

	/**
	 * 支付网关统计——汇总交易总金额
	 * 
	 * @return
	 */
	public List<Map<String, Object>> gatherPayGateAmount(String startdate,
			String enddate, String param);

	/**
	 * 支付网关统计——汇总最大交易金额
	 * 
	 * @return
	 */
	public List<Map<String, Object>> gatherPayGateHighAmount(String startdate,
			String enddate, String param);

	/**
	 * 支付网关统计——汇总交易笔数
	 * 
	 * @return
	 */
	public List<Map<String, Object>> gatherPayGateOrder(String startdate,
			String enddate, String param);

	/**
	 * 支付网关统计——汇总交易成功笔数
	 * 
	 * @return
	 */
	public List<Map<String, Object>> gatherPayGateSuccessOrder(
			String startdate, String enddate, String param);

}
